<?php
/**
 * インデックス画面コントローラ
 */
require_once 'Request/Request.php';
require_once 'Session.php';
require_once 'Google/Calendar2.php';
require_once dirname(__FILE__) . '/../models/AuthController.php';
require_once dirname(__FILE__) . '/../models/EventmapController.php';

/**
 * インデックス画面コントロールクラス
 * @author admin
 *
 */
class IndexController extends Zend_Controller_Action {
	/**
	 * リクエストキーコンスタント
	 */
	/** カレンダーユーザネーム */
	const KEY_CALENDAR_USER_NAME = 'c-user';
	/** カレンダーパスワード */
	const KEY_CALENDAR_PASSWORD = 'c-password';
	/** カレンダーマイカレンダー */
	const KEY_MY_CALENDAR_NAME = 'mycalendar';
	/** タスクユーザネーム */
	const KEY_TASK_USER_NAME ='t-user';
	/** タスクパスワード */
	const KEY_TASK_PASSWORD = 't-password';
	/** エラーコード */
	const KEY_ERROR = 'errorcode';
	/** 終了状態 */
	const KEY_CONDITION = 'condition';
	/** 言語 */
	const KEY_LANG = 'lang';
	/** 必須パラメータエラー */
	const VALUE_ERROR_REQUIRE = 'e-require';
	/** 同期完了 */
	const VALUE_COMPLETE = 'complete';
	/** 言語：英語 */
	const VALUE_ENGLISH = 'eng';
	/** 認証オブジェクト */
	protected $_auth;
	/** セッションオブジェクト */
	protected $_session;

	/**
	 * イニシャライザー
	 */
	public function init()
	{
		/* Initialize action controller here */
		$this->_auth = new Models_AuthController();
		$this->_setAuthFromUrl();
		$this->view->auth = $this->_auth;
		$this->_session = new Lib_Session('index');
		if (Lib_request::get(self::KEY_LANG) != '') {
			$this->_session->setValue(self::KEY_LANG, Lib_Request::get(self::KEY_LANG));
		}
	}

	/**
	 * ＵＲＬから認証情報を取得する
	 * session優先
	 */
	protected function _setAuthFromUrl()
	{
		/*** セッションからカレンダーアカウントユーザ名が取得できない場合、ＵＲＬ～取得 */
		if ($this->_auth->getValue(Models_AuthController::KEY_CALENDAR_USER) == ''){
			$this->_auth->setValue(
					Models_AuthController::KEY_CALENDAR_USER,
					Lib_Request::get(Models_AuthController::KEY_CALENDAR_USER)
			);
		}
		/*** セッションからカレンダーアカウントパスワードが取得できない場合、ＵＲＬ～取得 */
		if ($this->_auth->getValue(Models_AuthController::KEY_CALENDAR_PASSWORD) == '') {
			$this->_auth->setValue(
					Models_AuthController::KEY_CALENDAR_PASSWORD,
					Lib_Request::get(Models_AuthController::KEY_CALENDAR_PASSWORD)
			);
		}
		/*** セッションからカレンダー名が取得できない場合、ＵＲＬ～取得 */
		if ($this->_auth->getValue(Models_AuthController::KEY_CALENDAR_NAME) == '') {
			$this->_auth->setValue(Models_AuthController::KEY_CALENDAR_NAME,
					Lib_Request::get(Models_AuthController::KEY_CALENDAR_NAME)
			);
		}
		/*** セッションからタスクアカウントユーザ名が取得できない場合、ＵＲＬ～取得 */
		if ($this->_auth->getValue(Models_AuthController::KEY_TASK_USER) == '') {
			$this->_auth->setValue(
					Models_AuthController::KEY_TASK_USER,
					Lib_Request::get(Models_AuthController::KEY_TASK_USER)
			);
		}
		/*** セッションからタスクアカウントパスワードが取得できない場合、ＵＲＬから取得 */
		if ($this->_auth->getValue(Models_AuthController::KEY_TASK_PASSWORD) == '') {
			$this->_auth->setValue(
					Models_AuthController::KEY_TASK_PASSWORD,
					Lib_Request::get(Models_AuthController::KEY_TASK_PASSWORD)
			);
		}
	}

	/**
	 * デフォルトページ
	 */
	public function indexAction()
	{
		$condition = $this->_session->getValue(self::KEY_CONDITION);
		$lang = $this->_session->getValue(self::KEY_LANG);
		$this->_session->clear();
		$this->_session->setValue('done', 'index');
		$this->_session->setValue(self::KEY_LANG, $lang);
		$this->view->errMessage = $this->createErrorMessage($condition);
		$this->view->session = $this->_session;
		if ($condition == -1) {
			$this->view->condition = self::VALUE_COMPLETE;
		}
	}

	public function miniAction()
	{
		$condition = $this->_session->getValue(self::KEY_CONDITION);
		$this->_session->clear();
		$this->_session->setValue('done', 'mini');
		$this->view->errMessage = $this->createErrorMessage($condition);
		$this->view->session = $this->_session;
		if ($condition == -1) {
			$this->view->condition = self::VALUE_COMPLETE;
		}
	}

	/**
	 * 同期開始画面
	 * 進行中アニメーション表示のみ
	 * onLoadで同期実行画面にリダイレクト
	 */
	public function waitAction()
	{
		if ($this->_session->getValue('done') != 'mini') {
			/*** ログイン情報をセッションに設定する */
			$this->_auth->setValue(Models_AuthController::KEY_CALENDAR_USER,
					Lib_Request::get(Models_AuthController::KEY_CALENDAR_USER));
			$this->_auth->setValue(Models_AuthController::KEY_CALENDAR_PASSWORD,
					Lib_Request::get(Models_AuthController::KEY_CALENDAR_PASSWORD));
			$this->_auth->setValue(Models_AuthController::KEY_CALENDAR_NAME,
					Lib_Request::get(Models_AuthController::KEY_CALENDAR_NAME));
			$this->_auth->setValue(Models_AuthController::KEY_TASK_USER,
					Lib_Request::get(Models_AuthController::KEY_TASK_USER));
			$this->_auth->setValue(Models_AuthController::KEY_TASK_PASSWORD,
					Lib_Request::get(Models_AuthController::KEY_TASK_PASSWORD));

			/*** バリデーションチェック */
			if (!self::validParam()) {
				$this->_session->setValue(self::KEY_ERROR, self::VALUE_ERROR_REQUIRE);
				$this->_helper->redirector($this->_session->getValue('done'), 'index');
			}
		}

		$this->view->session = $this->_session;
	}

	/**
	 * 同期実実行画面
	 */
	public function syncAction()
	{
		$this->Googleカレンダークライアントインスタンス作成();
		$cUser = $this->_auth->getValue(Models_AuthController::KEY_CALENDAR_USER);
		$cPass = $this->_auth->getValue(Models_AuthController::KEY_CALENDAR_PASSWORD);
		$calendarName = $this->_auth->getValue(Models_AuthController::KEY_CALENDAR_NAME);
		$tUser = $this->_auth->getValue(Models_AuthController::KEY_TASK_USER);
		$tPass = $this->_auth->getValue(Models_AuthController::KEY_TASK_PASSWORD);
		$appid = Models_EventmappController::getAppIdToodledo();
		$eventMap = new Models_EventmappController($cUser, $cPass, $tUser, $tPass, $calendarName, $appid);
		/*** 処理結果コードをセッションに設定する */
		$this->_session->setValue(self::KEY_CONDITION, $eventMap->conditionCode);
		/*** 戻り先に遷移する */
		$this->_helper->redirector( $this->_session->getValue('done'),'index');
		/*** リダイレクト必須なのでレンダリング無し */
		$this->_helper->viewRenderer->setNoRender();
	}

	protected function Googleカレンダークライアントインスタンス作成()
	{
		$プロトコル = 'http';
		if (!empty($_SERVER['HTTPS'])) {
			$プロトコル = 'https';
		}
		Google_Calender::initSession($プロトコル . '://' . $_SERVER['HTTP_HOST'] . DOCUMENT_BASE_DIR . '/index/sync');
	}

	/**
	 * エラーメッセージを返す
	 * @param $conditionCode
	 * @return string
	 */
	public function createErrorMessage($conditionCode)
	{
		switch ($conditionCode) {
			case Models_EventmappController::VALUE_CONDITIONCODE_LOGIN_ERROR_CALENDAR:
				if ($this->_session->getValue(self::KEY_LANG) == self::VALUE_ENGLISH) {
					return "I cannot log in to a calendar. Please identify a password as a user name.";
				}
				return "カレンダーにログインできません。ユーザ名とパスワードを確認してください。";
			case Models_EventmappController::VALUE_CONDITIONCODE_LOGIN_ERRROR_TASK:
				if ($this->_session->getValue(self::KEY_LANG) == self::VALUE_ENGLISH) {
					return "I cannot log in to a task service. Please identify a password as a user name.";
				}
				return "タスクサービスにログインできません。ユーザ名とパスワードを確認してください。";
			case Models_EventmappController::VALUE_CODITIONCODE_CALENDAR_EVENT_ADD_ERROR:
			case Models_EventmappController::VALUE_CONDITIONCODE_CALENDAR_EVENT_GET_ERROR:
			case Models_EventmappController::VALUE_CONDITIONCODE_CALENDER_EVENT_UPDATE_ERROR:
			case Models_EventmappController::VALUE_CONDITIONCODE_TASK_EVENT_ADD_ERROR:
			case Models_EventmappController::VALUE_CONDITIONCODE_TASK_EVENT_GET_EEROR:
			case Models_EventmappController::VALUE_CONDITIONCODE_TASK_EVENT_UPDATE_ERROR:
				if ($this->_session->getValue(self::KEY_LANG) == self::VALUE_ENGLISH) {
					return "I failed in some synchronization. I take a pause, and, please carry it out once again.";
				}
				return "一部の同期に失敗しました。時間をおいてもう一度実行してください。";
			case Models_EventmappController::VALUE_CONDITIONCODE_NOCALENDATNAME:
				if ($this->_session->getValue(self::KEY_LANG) == self::VALUE_ENGLISH) {
					return "The name of my calendar is wrong.";
				}
				return "マイカレンダーの名前が間違っています。";
			case Models_EventmappController::VALUE_CONDITIONCODE_DISIDE_SYNCDATETIME:
				return "同期システムを初期化しました。この時間より後に変更したイベントを同期します。";
			default:
				return "";
		}
	}

	/**
	 * なし
	 */
	public function index2Action()
	{
		// action body
	}

	/**
	 * Ｔｏｏｄｌｅｄｏ　ＡＰＩ　Ｖ３ アタック
	 */
	public function t3Action()
	{

	}

	/**
	 * リクエストパラメータチェック
	 * @return boolean
	 */
	static public function validParam()
	{
		$request = new Lib_Request();
		$request->ValidRequireList = array(
//				Models_AuthController::KEY_CALENDAR_USER,
//				Models_AuthController::KEY_CALENDAR_PASSWORD,
				Models_AuthController::KEY_CALENDAR_NAME,
				Models_AuthController::KEY_TASK_USER,
				Models_AuthController::KEY_TASK_PASSWORD,
		);
		return $request->valid();
	}
}

